{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import keras.layers as KL\n",
    "from keras.models import Model\n",
    "import keras.backend as K\n",
    "import tensorflow as tf\n",
    "from keras.utils import np_utils\n",
    "from  keras.utils.vis_utils import plot_model\n",
    "import matplotlib.pyplot as plt\n",
    "from PIL import Image\n",
    "import numpy as np\n",
    "import os\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from keras.datasets import mnist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    " #创建resnet网络结构\n",
    "def building_block(filters,block):\n",
    "    #判断block1和2\n",
    "    if block != 0: #如果不等于0 那么使用 stride=1\n",
    "        stride = 1\n",
    "    else:         #如果等于0 采用stride 2 两倍下采样 也就是 如果是 building1 使用2倍下采样\n",
    "        stride = 2\n",
    "\n",
    "    def f(x):\n",
    "        #主通路结构\n",
    "        y = KL.Conv2D(filters=filters,kernel_size=(1,1),strides=stride)(x)\n",
    "        y = KL.BatchNormalization(axis=3)(y)\n",
    "        y = KL.Activation('relu')(y)\n",
    "                                        #注意这里没有stride使用padding same就是保证size相同\n",
    "        y = KL.Conv2D(filters=filters, kernel_size=(3, 3), padding='same')(y) \n",
    "        y = KL.BatchNormalization(axis=3)(y)\n",
    "        y = KL.Activation('relu')(y)\n",
    "\n",
    "        #主通路输出\n",
    "        y = KL.Conv2D(filters=4*filters,kernel_size=(1,1))(y)\n",
    "        y = KL.BatchNormalization(axis=3)(y)\n",
    "\n",
    "        #判断是哪个block 设定不同的 shortcut支路参数\n",
    "        if block == 0 : #如果是0 那么就是block1的通路\n",
    "            shortcut = KL.Conv2D(filters=4*filters,kernel_size=(1,1),strides=stride)(x)\n",
    "            shortcut = KL.BatchNormalization()(shortcut)\n",
    "\n",
    "        else:\n",
    "            #如果不等于0 那就是block2  那么就直接接input的tensor\n",
    "            shortcut = x\n",
    "\n",
    "        #主通路和shortcut 相加\n",
    "        y = KL.Add()([y,shortcut]) #y主 shortcut支路 直接通过add层相加\n",
    "        y = KL.Activation('relu')(y)\n",
    "        return y\n",
    "    return f"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "#resnet fp提取\n",
    "def ResNet_Extractor(X_train, Y_train,X_test,Y_test):\n",
    "    input = KL.Input([28,28,1])\n",
    "    x = KL.Conv2D(filters=64,kernel_size=(3,3),padding='same')(input)\n",
    "    x = KL.BatchNormalization(axis=3)(x)\n",
    "    x = KL.Activation('relu')(x)\n",
    "   \n",
    "\n",
    "    #控制调用网络结构\n",
    "    #每个stage要有不同的 block 12222的数量 ，还有 第一个Block1 输入维度后边要迭代（stage）\n",
    "    filters = 64\n",
    "    block = [2,2] # 设定block布局\n",
    "    for i,block_num in enumerate(block):\n",
    "        print ('---stage--', str(i) ,'---')\n",
    "        for block_id in range(block_num):\n",
    "            print('---block--', str(block_id) ,'---')\n",
    "            x = building_block(filters=filters,block=block_id)(x)\n",
    "        filters *= 2 #每个stage double filter个数\n",
    "     #注意这里的输出就是我们常规的featuremap的输出x\n",
    "    x = KL.AveragePooling2D(pool_size=(2, 2))(x)\n",
    "    x = KL.Flatten()(x)\n",
    "    x = KL.Dense(10, activation='softmax')(x)\n",
    "   #定义输入输出\n",
    "    model = Model(inputs=input, outputs=x)\n",
    "    #打印网络\n",
    "    print (model.summary())\n",
    "    plot_model(model,to_file='resMnist6-9-2.png',show_shapes=True)\n",
    "    #编译网络\n",
    "    model.compile(loss='categorical_crossentropy',\n",
    "                  optimizer='adam',\n",
    "                  metrics=['accuracy'])\n",
    "    \n",
    "    history = model.fit(\n",
    "        X_train,\n",
    "        Y_train,\n",
    "        epochs=6,\n",
    "        batch_size=200,\n",
    "        verbose=1,\n",
    "        validation_data = (X_test,Y_test),\n",
    "    )\n",
    "#     # SAVE your work -model\n",
    "     \n",
    "    model.save('./mnistRES2.h5')\n",
    "    \n",
    "    #打印graph\n",
    "    \n",
    "    plt.plot(history.history['loss'])\n",
    "    plt.plot(history.history['val_loss'])\n",
    "    plt.title(\"model loss\")\n",
    "    plt.ylabel(\"loss\")\n",
    "    plt.xlabel(\"epoch\")\n",
    "    plt.legend([\"train\",\"test\"],loc=\"upper left\")\n",
    "    plt.show()\n",
    "    \n",
    "    plt.plot(history.history['acc'])\n",
    "    plt.plot(history.history['val_acc'])\n",
    "    plt.title('model accuracy')\n",
    "    plt.ylabel('accuracy')\n",
    "    plt.xlabel('epoch')\n",
    "    plt.legend(['train', 'test'], loc='upper left')\n",
    "    plt.show()\n",
    "  \n",
    "    \n",
    "\n",
    "    return model\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000, 28, 28)\n",
      "(60000, 28, 28, 1)\n",
      "---stage-- 0 ---\n",
      "---block-- 0 ---\n",
      "---block-- 1 ---\n",
      "---stage-- 1 ---\n",
      "---block-- 0 ---\n",
      "---block-- 1 ---\n",
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "input_4 (InputLayer)            (None, 28, 28, 1)    0                                            \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_34 (Conv2D)              (None, 28, 28, 64)   640         input_4[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_34 (BatchNo (None, 28, 28, 64)   256         conv2d_34[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_28 (Activation)      (None, 28, 28, 64)   0           batch_normalization_34[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_35 (Conv2D)              (None, 14, 14, 64)   4160        activation_28[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_35 (BatchNo (None, 14, 14, 64)   256         conv2d_35[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_29 (Activation)      (None, 14, 14, 64)   0           batch_normalization_35[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_36 (Conv2D)              (None, 14, 14, 64)   36928       activation_29[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_36 (BatchNo (None, 14, 14, 64)   256         conv2d_36[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_30 (Activation)      (None, 14, 14, 64)   0           batch_normalization_36[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_37 (Conv2D)              (None, 14, 14, 256)  16640       activation_30[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_38 (Conv2D)              (None, 14, 14, 256)  16640       activation_28[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_37 (BatchNo (None, 14, 14, 256)  1024        conv2d_37[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_38 (BatchNo (None, 14, 14, 256)  1024        conv2d_38[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "add_9 (Add)                     (None, 14, 14, 256)  0           batch_normalization_37[0][0]     \n",
      "                                                                 batch_normalization_38[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "activation_31 (Activation)      (None, 14, 14, 256)  0           add_9[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_39 (Conv2D)              (None, 14, 14, 64)   16448       activation_31[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_39 (BatchNo (None, 14, 14, 64)   256         conv2d_39[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_32 (Activation)      (None, 14, 14, 64)   0           batch_normalization_39[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_40 (Conv2D)              (None, 14, 14, 64)   36928       activation_32[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_40 (BatchNo (None, 14, 14, 64)   256         conv2d_40[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_33 (Activation)      (None, 14, 14, 64)   0           batch_normalization_40[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_41 (Conv2D)              (None, 14, 14, 256)  16640       activation_33[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_41 (BatchNo (None, 14, 14, 256)  1024        conv2d_41[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "add_10 (Add)                    (None, 14, 14, 256)  0           batch_normalization_41[0][0]     \n",
      "                                                                 activation_31[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "activation_34 (Activation)      (None, 14, 14, 256)  0           add_10[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_42 (Conv2D)              (None, 7, 7, 128)    32896       activation_34[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_42 (BatchNo (None, 7, 7, 128)    512         conv2d_42[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_35 (Activation)      (None, 7, 7, 128)    0           batch_normalization_42[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_43 (Conv2D)              (None, 7, 7, 128)    147584      activation_35[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_43 (BatchNo (None, 7, 7, 128)    512         conv2d_43[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_36 (Activation)      (None, 7, 7, 128)    0           batch_normalization_43[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_44 (Conv2D)              (None, 7, 7, 512)    66048       activation_36[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_45 (Conv2D)              (None, 7, 7, 512)    131584      activation_34[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_44 (BatchNo (None, 7, 7, 512)    2048        conv2d_44[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_45 (BatchNo (None, 7, 7, 512)    2048        conv2d_45[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "add_11 (Add)                    (None, 7, 7, 512)    0           batch_normalization_44[0][0]     \n",
      "                                                                 batch_normalization_45[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "activation_37 (Activation)      (None, 7, 7, 512)    0           add_11[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_46 (Conv2D)              (None, 7, 7, 128)    65664       activation_37[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_46 (BatchNo (None, 7, 7, 128)    512         conv2d_46[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_38 (Activation)      (None, 7, 7, 128)    0           batch_normalization_46[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_47 (Conv2D)              (None, 7, 7, 128)    147584      activation_38[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_47 (BatchNo (None, 7, 7, 128)    512         conv2d_47[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "activation_39 (Activation)      (None, 7, 7, 128)    0           batch_normalization_47[0][0]     \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_48 (Conv2D)              (None, 7, 7, 512)    66048       activation_39[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization_48 (BatchNo (None, 7, 7, 512)    2048        conv2d_48[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "add_12 (Add)                    (None, 7, 7, 512)    0           batch_normalization_48[0][0]     \n",
      "                                                                 activation_37[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "activation_40 (Activation)      (None, 7, 7, 512)    0           add_12[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "average_pooling2d_4 (AveragePoo (None, 3, 3, 512)    0           activation_40[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "flatten_4 (Flatten)             (None, 4608)         0           average_pooling2d_4[0][0]        \n",
      "__________________________________________________________________________________________________\n",
      "dense_4 (Dense)                 (None, 10)           46090       flatten_4[0][0]                  \n",
      "==================================================================================================\n",
      "Total params: 861,066\n",
      "Trainable params: 854,794\n",
      "Non-trainable params: 6,272\n",
      "__________________________________________________________________________________________________\n",
      "None\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /home/mikegao/anaconda3/lib/python3.7/site-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.cast instead.\n",
      "Train on 60000 samples, validate on 10000 samples\n",
      "Epoch 1/6\n",
      "60000/60000 [==============================] - 1344s 22ms/step - loss: 0.1873 - acc: 0.9499 - val_loss: 0.0671 - val_acc: 0.9786\n",
      "Epoch 2/6\n",
      "60000/60000 [==============================] - 1334s 22ms/step - loss: 0.0353 - acc: 0.9885 - val_loss: 0.0521 - val_acc: 0.9854\n",
      "Epoch 3/6\n",
      "60000/60000 [==============================] - 1337s 22ms/step - loss: 0.0259 - acc: 0.9915 - val_loss: 0.0506 - val_acc: 0.9858\n",
      "Epoch 4/6\n",
      "60000/60000 [==============================] - 1334s 22ms/step - loss: 0.0240 - acc: 0.9925 - val_loss: 0.0414 - val_acc: 0.9883\n",
      "Epoch 5/6\n",
      "60000/60000 [==============================] - 1343s 22ms/step - loss: 0.0206 - acc: 0.9935 - val_loss: 0.0456 - val_acc: 0.9871\n",
      "Epoch 6/6\n",
      "60000/60000 [==============================] - 1334s 22ms/step - loss: 0.0166 - acc: 0.9947 - val_loss: 0.0388 - val_acc: 0.9885\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "def main():\n",
    "    (X_train,Y_train),(X_test,Y_test) = mnist.load_data()\n",
    "    print(X_train.shape)\n",
    "    \n",
    "    X_train = X_train.reshape(-1,28,28,1)\n",
    "    \n",
    "    X_test = X_test.reshape(-1,28,28,1)\n",
    "    print (X_train.shape)\n",
    "    #-set type into float32 设置成浮点型\n",
    "    X_train = X_train.astype('float32')  #astype SET AS TYPE into \n",
    "    X_test = X_test.astype('float32')\n",
    "    X_train = X_train/255.0\n",
    "    X_test /=255.0\n",
    "\n",
    "    #Class vectors [0,0,0,0,0,0,0,1(7),0,0] #转成二进制\n",
    "    Y_test = np_utils.to_categorical(Y_test,10) #定义LABEL类数量\n",
    "    Y_train = np_utils.to_categorical(Y_train,10)\n",
    "\n",
    "    ResNet_Extractor(X_train, Y_train,X_test,Y_test)\n",
    "\n",
    "main()\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
